%define CS_ACCES        10011011b
%define DS_ACCES        10010011b
%define	BASE	0x100
%define KSIZE	30

[BITS 16]
[ORG 0x0]

jmp start

%include "UTIL.INC"
%include "GDT.INC"

start:
	mov [bootdrv],dl	; recuparation de l'unite de boot

; initialisation des segments en 0x07C0
	mov ax,0x07C0
	mov ds,ax
	mov es,ax
	mov ax,0x8000	; stack en 0xFFFF
	mov ss,ax
	mov sp, 0xf000

; affiche un msg
	mov si,msgDebut
	call afficher

; charger le noyau
	xor ax,ax
	int 0x13

	push es
	mov ax,BASE
	mov es,ax
	mov bx,0
	
	mov ah,2
	mov al,KSIZE
	mov ch,0
	mov cl,2
	mov dh,0
	mov dl,[bootdrv]
	int 0x13
	pop es


; initialisation de la GDT
; descInit base(32),limite(20/32),acces(8),flags(4/8),adresse(16)
	descInit 0,0xFFFFF,CS_ACCES,1101b,gdt_cs
	descInit 0,0xFFFFF,DS_ACCES,1101b,gdt_ds

; initialisation du pointeur sur la GDT
	mov ax,gdtend	; calcule la limite de GDT
	mov bx,gdt
	sub ax,bx
	mov word [gdtptr],ax

	xor eax,eax		; calcule l'adresse lineaire de GDT
	mov ax,ds
	mov bx,gdt
	call calcadr
	mov dword [gdtptr+2],ecx

; passage en modep
	cli
	lgdt [gdtptr]	; charge la gdt
	mov eax,cr0
	or	ax,1
	mov cr0,eax		; PE mis a 1 (CR0)

	jmp next
next:
	mov ax,0x10		; segment de donne
	mov ds,ax
	mov fs,ax
	mov gs,ax
	mov es,ax
	mov ss,ax
	mov esp,0x9F000	

	jmp dword 0x8:0x1000

end:
	jmp end


msgDebut	db	"loading kernel",13,10,0

gdt:
gdt_null:
	dw 0,0,0,0
gdt_cs:
	dw 0,0,0,0
gdt_ds:
	dw 0,0,0,0
gdtend:

gdtptr:
	dw	0x0000		; limite
	dd	0			; base

bootdrv: db 0


;--------------------------------------------------------------------
;; NOP jusqu'a 510
times 510-($-$$) db 144
dw 0xAA55
